#============================================================
#    Editor Tool
#============================================================
# - datetime: 2022-12-23 19:34:16
#============================================================
## 编辑器工具类（请注意，它只能用在编辑器中，游戏运行后将无效）
class_name EditorUtil



##  获取编辑器接口
##[br]
##[br][code]return[/code]  
static func get_editor_interface() -> EditorInterface:
	return SingleDataUtil.get_meta_data("EditorUtil_get_editor_interface", func(): 
		# 默认值
		return EditorScript.new().get_editor_interface() 
	)


##  获取编辑器主题图标
##[br]
##[br][code]name[/code]  图标名称
##[br]
##[br][code]return[/code]  返回这个图标
static func get_editor_theme_icon(name: StringName) -> Texture:
	return get_editor_interface().get_base_control().get_theme_icon(name, "EditorIcons")


##  获取选中的节点
##[br]
##[br][code]return[/code]  返回选中的节点列表
static func get_selected_nodes() -> Array[Node]:
	return get_editor_interface().get_selection().get_selected_nodes()


##  获取这个路径的文件系统目录
##[br]
##[br][code]path[/code]  目录路径
##[br]
##[br][code]return[/code]  返回这个编辑器文件系统目录
static func get_filesystem_path(path: String) -> EditorFileSystemDirectory:
	return get_editor_interface().get_resource_filesystem().get_filesystem_path(path)


##  获取当前编辑器的编辑视图名称（2D、3D、Script、AssetLib），如果没有这几个，则返回空字符串
static func get_main_screen_editor_name() -> String:
	var class_to_node_map = SingleDataUtil.get_meta_data("EditorUtil_clas_to_node_map", func():
		return {
			"CanvasItemEditor": null,
			"Node3DEditor": null,
			"ScriptEditor": null,
			"EditorAssetLibrary": null,
			"CPUParticles3DEditor": null,
			"GPUParticles3DEditor": null,
			"MeshInstance3DEditor": null,
			"MeshLibraryEditor": null,
			"MultiMeshEditor": null,
			"Skeleton2DEditor": null,
			"Sprite2DEditor": null,
			"NavigationMeshEditor": null,
		}
	)
	
	if class_to_node_map.CanvasItemEditor == null:
		# 扫描子节点
		var main_screen = get_editor_interface().get_editor_main_screen()
		for child in main_screen.get_children():
			var class_ = child.get_class()
			if class_to_node_map.has(class_):
				class_to_node_map[class_] = child
	
	# 2D
	if class_to_node_map.CanvasItemEditor.visible:
		return "2D"
	# 3D
	if class_to_node_map.Node3DEditor.visible:
		return "3D"
	# Script
	if class_to_node_map.ScriptEditor.visible:
		return "Script"
	# AssetLib
	if class_to_node_map.EditorAssetLibrary.visible:
		return "AssetLib"
	return ""


##  获取插件名（这个插件需要是插件可开启或关闭的插件对象，而非自定义的随处放置的插件对象）
##[br]
##[br][code]plugin[/code]  插件对象
##[br]
##[br][code]return[/code]  返回这个插件的插件名
static func get_plugin_name(plugin: EditorPlugin) -> StringName:
	return plugin.get_script().resource_path.get_base_dir().get_file()


##  重新加载插件
##[br]
##[br][code]plugin[/code]  
static func reload_plugin(plugin: EditorPlugin) -> void:
	if plugin != null:
		var plugin_name = get_plugin_name(plugin)
		var editor_interface = get_editor_interface()
		editor_interface.set_plugin_enabled(plugin_name, false)
		await get_editor_interface().get_tree().create_timer(0.1).timeout
		editor_interface.set_plugin_enabled(plugin_name, true)
		print("已重新加载 ", plugin_name, " 插件")
	else:
		printerr("<plugin 参数为值 null>")


##  文件系统定位到这个路径
##[br]
##[br][code]path[/code]  要定位的路径
static func navigate_to_path(path: String) -> void:
	get_editor_interface().get_file_system_dock().navigate_to_path(path)

